JavaScript - Objetos Fundamentais

Objetos fundamentais - Conceitos

JavaScript é orientado a objetos mas como o conceito de classes e objetos é implementado no JavaScript ?
Em qualquer linguagem de programação, Classes são declarações de como uma tarefa deve ser realizada, seus métodos (seriam os verbos ou aquilo que deve ser feito ou processado para realizar a tarefa), a sequencia que esses métodos devem ser executados, suas propriedades ou características (duro, mole, quente, frio, alto, baixo, liquido, sólido, etc) e os valores dessas propriedades (ex.: verbo = aquecer o forno, propriedade: a 180graus, verbo=esperar o bolo assar, propriedade:por 25 minutos, característica=solido, valores=ralar/cortar em fatias bem finas, característica=liquido, propriedade=um copo de 250 ml).

Sendo assim podemos dizer que classes são descrições puramente abstratas porque na realidade elas não existem realmente, só são modelos, definições, receitas da resolução da tarefa e não a execução da tarefa em sí.
Na hora que você declara y = new Classe tudo que existe na classe é carregado na memória (copiado- chamamos isso de instancia o objeto) e a variável y passa a apontar para essa 'cópia' do objeto primitivo e, a partir daí, o objeto y existe realmente independente do objeto original podendo ser modificado. O objeto y também herda tudo que foi declarado da Classe os Métodos, propriedades e valores de propriedades da classe.

Infelizmente para que o JavaScript ficasse o menor e mais leve possível ele não é baseada em classes mas sim em protótipos , ou seja, em modelos ou protótipos pré-construídos que podem ser usadas para contruir outras coisas, herdando dos objetos primitivos suas características.
Você pode achar estranho isso mas é muito comum. No SQL Server tem uma base de dados chamada model que é um modelo de criação de banco de dados. Ela foi criada e existe somente para ser um modelo, nada mais, sequer pode ser usada pelo usuário.

Digamos que temos um modelo de objeto (no JavaScript é chamado de protótipo) e ao definir var x = Objeto; estamos criando a variável x que aponta para o protótipo do objeto. A variável x em sí não é nada mais que um ponteiro ou indicador para o protótipo do objeto global do JavasCript.

Quando executamos var y = new Object(); aí sim copiamos modelo objeto na memória (chamamos isso de instanciar o elemento) e o elemento y aponta para esse objeto na memória e passará a existir realmente, com todos os Métodos, propriedades e valores de propriedades do objeto.
O objeto y criado dessa maneira 'copiou' o protótipo do objeto para sí tudo que ele tinha e agora ele existe independentemente do objeto original.

Este assunto é complexo e importante, caso tenha dúvidas veja o site Mozilla

No body da página, logo no começo coloquei o seguinte script:
    <script><br />
        var x = Object;<br />
        var y = new Object;<br />
    </script><br />

Ao declarar var x = Object; definimos que a variável x que, pela atribuição, aponta para o protótipo do objeto mas a variável x não é um objeto, apenas aponta para o protótipo, na linguagem C chamamos isso de um ponteiro ou pointer.

Contudo ao declarar var y = new Object; aíi sim copiamos do protótipo de objeto para uma região de memória e definimos que a variável y herda tudo do prototipo do objeto global inclusive instanciando na memória, portanto a variável y é um objeto real e separado do protótipo original de objeto do JavaScript.
Abaixo aplico na prática o que falei acima.


Objetos Fundamentais

Os objetos básicos e fundamentais são 'modelos' ou 'protótipos primitivos ' nos quais todos os outros itens serão criados. Isso inclui objetos que representam objetos gerais, funções e erros.

Object :

O construtor de Object aponta para um protótipo de objeto definido globalmente no JavaScript.

Por este motivo var x = Object; é um simples ponteiro para o protótipo do objeto enquanto o verbo new em var y = new Object; faz com que o JavaScript copie o prototipo do objeto para a a memória e atribua a variável y.

Exemplo:
Criei os objetos x e y como descrito acima e abaixo tem um botão que dá um alert nos objetos criados alert(x) depois alert(y).


Script da funcionalidade acima:
     <script>
      function fncExibeObjetos() {
          var x = Object;
          alert(x);
          alert(y);
      }
     </script>

<input type="button" value="Clique aqui para emitir o alert dele" onclick="fncExibeObjetos();" />

Notas : o x.alert(); retornou function Object(){[native code]} que é o protótipo do objeto. Note que nada em x poderia ser alterado porque ele aponta para um protótipo do JavaScript que foi criado para servir de modelo e por isso não pode ser alterado.
Depois de instanciado, o alert(y)=[Object Object], ai sim, pode ser alterado mas não seria o protótipo do Object mas sim a variável y que instanciou o objeto.

Propriedades do construtor de objeto

Object.length : Tem o valor 1 mas só se aplica ao protótipo do objeto, não ao objeto em si.
   é um pointer para o protótipo de Object e retorna 1
   é um Object e retorna undefined
Note que retorna 1 quando o objeto é um protótipo e undefined quando o Objeto já existe.

Object.prototype : Dá acesso ao protótipo do objeto criado permitindo a adição de propriedades ao mesmo.
   é o pointer para o protótipo de Object-Retorna o Objeto em sí.
   é um objeto e retorna undefined.
Retornará a definição do objeto em si, ou um protótipo de objeto ou undefined se já for um objeto criado na memória.

Métodos do construtor de objeto

Object.assign()
Copia os valores de todas as propriedades próprias enumeráveis ​​de um ou mais objetos de origem para um objeto de destino.
Object.create()
Cria um novo objeto com o objeto de protótipo especificado e propriedades.
Object.defineProperty()
Adiciona a propriedade nomeada descrita por um determinado descritor a um objeto.
Object.defineProperties()
Adiciona as propriedades nomeadas descritas pelos descritores fornecidos a um objeto.
Object.entries()
Retorna uma matriz contendo todos os pares [chave, valor] das propriedades de string enumeráveis ​​do próprio objeto.
Object.freeze()
Congela um objeto: outro código não pode excluir ou alterar nenhuma propriedade.
Object.fromEntries()
Retorna um novo objeto de um iterável de pares de valores-chave (reverte Object.entries).
Object.getOwnPropertyDescriptor()
Retorna um descritor de propriedade para uma propriedade nomeada em um objeto.
Object.getOwnPropertyDescriptors()
Retorna um objeto que contém todos os descritores de propriedade próprios de um objeto.
Object.getOwnPropertyNames()
Retorna uma matriz contendo os nomes de todas as propriedades enumeráveis ​​e não enumeráveis ​​do próprio objeto fornecido.
Object.getOwnPropertySymbols()
Retorna uma matriz de todas as propriedades de símbolo encontradas diretamente em um determinado objeto.
Object.getPrototypeOf()
Retorna o protótipo do objeto especificado.
Object.is()
Compara se dois valores são o mesmo valor. É igual a todos os valores NaN (que diferem tanto da Comparação de Igualdade Abstrata quanto da Comparação Estrita de Igualdade).
Object.isExtensible()
Determina se a extensão de um objeto é permitida.
Object.isFrozen()
Determina se um objeto foi congelado.
Object.isSealed()
Determina se um objeto está lacrado.
Object.keys()
Retorna uma matriz contendo os nomes de todas as propriedades de string enumeráveis ​​do próprio objeto fornecido.
Object.preventExtensions()
Impede qualquer extensão de um objeto.
Object.seal()
Impede que outro código exclua propriedades de um objeto.
Object.setPrototypeOf()
Define o protótipo (ou seja, a propriedade interna [[Prototype]]).
Object.values​()
Retorna uma matriz contendo os valores que correspondem a todas as propriedades dos string enumeráveis ​​do próprio objeto.


Instâncias de objeto e objeto de protótipo de objeto

Todos os objetos em JavaScript são descendentes de Object; todos os objetos herdam métodos e propriedades de Object.prototype, embora possam ser substituídos. Por exemplo, os protótipos de outros construtores substituem a propriedade do construtor e fornecem seus próprios métodos toString (). As alterações no objeto de protótipo Object são propagadas para todos os objetos, a menos que as propriedades e métodos sujeitos a essas alterações sejam substituídos posteriormente ao longo da cadeia de protótipo.


Propriedades
Object.prototype.constructor
Especifica a função que cria o protótipo de um objeto.
Object.prototype.__proto__
Aponta para o objeto que foi usado como protótipo quando o objeto foi instanciado.
Object.prototype.__noSuchMethod__
Permite que seja definida uma função que será executada quando um membro indefinido do objeto for chamado como método.
Object.prototype .__count__
Usado para retornar o número de propriedades enumeráveis ​​diretamente em um objeto definido pelo usuário, mas foi removido.
Object.prototype.__ parent__
Usado para apontar para o contexto de um objeto, mas foi removido.


Métodos
Object.prototype.__defineGetter__()
Associa uma função a uma propriedade que, ao ser acessada, executa aquela função e retorna seu valor de retorno.
Object.prototype.__defineSetter__()
Associa uma função a uma propriedade que, quando definida, executa aquela função que modifica a propriedade.
Object.prototype .__lookupGetter __()
Retorna a função associada à propriedade especificada pelo método__defineGetter__().
Object.prototype.__lookupSetter__()
Retorna a função associada à propriedade especificada pelo método__defineSetter__().
Object.prototype.hasOwnProperty()
Retorna um booleano indicando se um objeto contém a propriedade especificada como uma propriedade direta desse objeto e não herdada por meio da cadeia de protótipo.
Object.prototype.isPrototypeOf()
Retorna um booleano indicando se o objeto ao qual este método é chamado está na cadeia de protótipo do objeto especificado.
Object.prototype.propertyIsEnumerable()
Retorna um booleano indicando se o atributo ECMAScript interno [[Enumerable]] está definido.
Object.prototype.toSource()
Retorna string contendo a fonte de um literal de objeto que representa o objeto que este método é chamado; você pode usar este valor para criar um novo objeto.
Object.prototype.toLocaleString()
Chama toString().
Object.prototype.toString()
Retorna uma representação de string do objeto.
Object.prototype.unwatch()
Remove um ponto de controle de uma propriedade do objeto.
Object.prototype.valueOf()
Retorna o valor primitivo do objeto especificado.
Object.prototype.watch()
Adiciona um ponto de controle a uma propriedade do objeto.
Object.prototype.eval()
Usado para avaliar uma string de código JavaScript no contexto do objeto especificado, mas foi removido.


Excluir uma propriedade de um objeto

Não há nenhum método em um objeto para excluir suas próprias propriedades (por exemplo, Map.prototype.delete ()). Para fazer isso, é necessário usar o operador delete.

Exemplos
Usando Object fornecidos com tipos indefinidos e nulos.

Os exemplos a seguir armazenam um objeto Object vazio em o:
var o = new objeto ();
var o = new objeto (indefinido);
var o = new objeto (nulo);

Usando Object para criar objetos Boolean
Os exemplos a seguir armazenam objetos booleanos em o:
var o = new objeto (verdadeiro); // equivalente a o = new Boolean (true);
var o = new objeto (Boolean ()); // equivalente a o = new Boolean (false);


Function

Boolean

Symbol

Error

EvalError

InternalError

RangeError

ReferenceError

SyntaxError

TypeError

URIError